<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br" lang="pt-br">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Roteamento URI : Guia do Usuário CodeIgniter</title>

<style type='text/css' media='all'>@import url('../userguide.css');</style>
<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' />

<script type="text/javascript" src="../nav/nav.js"></script>
<script type="text/javascript" src="../nav/prototype.lite.js"></script>
<script type="text/javascript" src="../nav/moo.fx.js"></script>
<script type="text/javascript" src="../nav/user_guide_menu.js"></script>

<meta http-equiv="expires" content="-1" />
<meta http-equiv="pragma" content="no-cache" />
<meta name="robots" content="all" />
<meta name="author" content="ExpressionEngine Dev Team" />
<meta name="description" content="Guia do Usuário do CodeIgniter" />

</head>
<body>

<!-- START NAVIGATION -->
<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div>
<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Alternar Tabela de Conteúdos" alt="Alternar Tabela de Conteúdos" /></a></div>
<div id="masthead">
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td><h1>Guia de Usuário CodeIgniter Versão 2.0.0</h1></td>
<td id="breadcrumb_right"><a href="../toc.html">Tabela de Conteúdos</a></td>
</tr>
</table>
</div>
<!-- END NAVIGATION -->


<!-- START BREADCRUMB -->
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td id="breadcrumb">
<a href="http://codeigniter.com.br/">Página Inicial</a> › 
<a href="../index.html">Guia de Usuário CodeIgniter</a> › Roteamento URI
</td>
<td id="searchbox"><form method="get" action="http://www.google.com.br/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com.br/manual/" />Busca <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" /> <input type="submit" class="submit" name="sa" value="Ok" /></form></td>
</tr>
</table>
<!-- END BREADCRUMB -->

<br clear="all" />


<!-- START CONTENT -->
<div id="content">

<h1>Roteamento URI</h1>

<p>Tipicamente há uma relação um-a-um entre a string URL e seu correspondente
controlador classe/método. Os segmentos em um URI normalmente seguem este padrão:</p>

<code>www.seu-site.com/<dfn>classe</dfn>/<samp>funcao</samp>/<var>id</var>/</code>

<p>Em alguns momentos, no entanto, você pode querer remapear esta relação para que
uma classe/função diferente possa ser chamada no lugar daquela URL correspondente.</p>

<p>Por exemplo, vamos dizer que você quer que suas URLs tenham este protótipo:</p>

<p>
www.seu-site.com/produto/1/<br />
www.seu-site.com/produto/2/<br />
www.seu-site.com/produto/3/<br />
www.seu-site.com/produto/4/
</p>

<p>Normalmente o segundo segmento da URL está reservado para o nome da função,
mas no exemplo acima há um ID de produto no lugar. Para resolver isto, o
Code Igniter permite que você remapeie o handler URI.</p>


<h2>Configurando suas próprias regras de roteamento</h2>

<p>Regras de roteamento são definidas em seu arquivo <var>application/config/routes.php</var>.
Nele, você verá uma array chamada <dfn>$route</dfn> que permite que você especifique
seus próprios critérios. As rotas podem tanto ser espeficicadas usando <dfn>caracteres curinga (wildcards)</dfn> como <dfn>Expressões Regulares</dfn></p>


<h2>Caractere Curinga - Wildcards</h2>

<p>Uma típica rota curinga se parece com esta:</p>

<code>$route['produto/:num'] = "catalogo/produto_busca";</code>

<p>Numa rota, o índice da array contém o URI a ser correspondido, enquanto que o valor
da array contém o destino para qual ele deverá ser encaminhado, ou seja, sua nova rota.
No exemplo acima, se a palavra "produto" for encontrada no primeiro
segmento da URL, e um número for encontrado no segundo, a classe
"catalogo" e o método "produto_busca" serão utilizados no lugar.</p>

<p>Você pode usar valores literais ou então pode usar dois tipos de curingas:</p>

<p>
    <strong>(:num)</strong> irá igualar um segmento contendo apenas números.<br />
    <strong>(:any)</strong> irá igualar um segmento contendo qualquer caracter.
</p>

<p class="important"><strong>Nota:</strong> As rotas serão executadas na ordem em que forem definidas. Rotas de nível mais alto sempre terão precedência às de nível mais baixo.</p>

<h2>Exemplos</h2>

<p>Aqui vão alguns exemplo de roteamento:</p>

<code>$route['journals'] = "blogs";</code>
<p>Uma URL contendo a palavra "jornals" no primeiro segmento irá ser remapeada à classe "blogs".</p>

<code>$route['blog/joe'] = "blogs/users/34";</code>
<p>Uma URL contendo os segmentos blog/joe será remapeada à classe "blogs" e ao método "users". O ID será 'setado' como "34".</p>

<code>$route['produto/(:any)'] = "catalogo/produto_busca";</code>
<p>Uma URL contendo "produto" como primeiro segmento, e qualquer palavra no segundo, será remapeada à classe "catalogo" e ao método "produto_busca".</p>

<code>$route['produto/(:num)'] = "catalogo/produto_busca_por_id/$1";</code>
<p>Uma URL contendo "produto" como o primeiro segmento, e um número no segundo, será remapeada à classe "catalogo" e ao método "produto_busca_por_id" passando a correspondência como variável para a função.</p>

<p class="important"><strong>Importante:</strong> Não use barras normais nem invertidas no final.</p>

<h2>Expressões Regulares</h2>

<p>Se você preferir, pode usar expressões regulares para definir suas regras de rotas. Qualquer expressão regular válida é permitida, assim como back-references.</p>

<p class="important"><strong>Nota:</strong> se você usar back-references, deve usar a sintaxe com o sinal de dolar ($) no lugar da barra invertida dupla (\\).</p>

<p>Uma típica rota RegEx se parece com algo assim:</p>

<code>$route['produtos/([a-z]+)/(\d+)'] = "$1/id_$2";</code>

<p>No exemplo acima, um URI similar a <dfn>produtos/camisas/123</dfn> iria chamar a classe controladora <dfn>camisas</dfn> e a função <dfn>id_123</dfn>.</p>

<code>
    $route['^(?!cms|site).*'] 	= "site/abrir/$0"; <br />
    $route['cms/login']		= 'cms/site/login'; <br />
    $route['cms/(:any)'] 		= "cms/$1"; <br />
    $route['site/(:any)']		= "site/$1";
</code>

<p>
    Você pode também misturar curingas com expressões regulares. <br />
    Como no exemplo acima, qualquer URL que o primeiro segmento não for similar a
    <dfn>cms</dfn> ou <dfn>site</dfn>, irá chamar uma classe <dfn>site</dfn>, e
    usar seu método <dfn>abrir</dfn> (muito útil para casos de nomes dinâmicos no segundo
    segmento, como por exemplo um site com vários autores cadastrados no banco de dados e
    que você queira que o remapeamento seja automático para cada usuário: www.seu-site.com.br/fernandoaraujo,
    www.seu-site.com.br/joe, etc).<br /> Quando for acessada a URL <dfn>cms/login</dfn>
    ela será remapeada para a classe <dfn>cms</dfn>, o método <dfn>site</dfn> e
    passará como variável a palavra <dfn>login</dfn> (considerando que esteja sendo 
    usada a estrutura padrão da pasta controllers). <br /> E as duas últimas linhas
    obedecem as regras do curinga normalmente, o que for for cms/*** vai para cms/***, assim como site/***.
</p>

<h2>Rotas Reservadas</h2>

<p>Há somente uma rota reservada:</p>

<code>$route['default_controller'] = 'welcome';</code>

<p>Esta rota indica qual classe controle deverá ser chamada se o URI não contiver dados,
o que seria o caso quando alguém carrega a URL raiz. No exemplo cima, a classe "welcome" seria carregada.
Você é encorajado a sempre ter uma rota default, do contrário uma página 404 irá aparecer como default.</p>

<p class="important"><strong>Importante:</strong> Rotas reservadas devem vir antes de qualquer rota curinga ou RegEx.</p>

</div>
<!-- END CONTENT -->


<div id="footer">
<p>
Tópico Anterior:&nbsp;&nbsp;<a href="common_functions.html">Funções Comuns</a>
&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="#top">Topo da Página</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="../index.html">Guia de Usuário CodeIgniter</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
Próximo Assunto:&nbsp;&nbsp;<a href="errors.html">Tratamento de Erros</a>
</p>
<p><a href="http://codeigniter.com.br">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2011 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a></p>
</div>

</body>
</html>